MySQL relay_log_purge=0 时的风险
这篇讲的是当MySQL设置`relay_log_purge=0`时,一个容易被忽略的数据一致性风险。很多DBA为了在高可用切换后能用上relay log补齐数据,会选择禁止自动清除,但官方文档提示这在使用`relay_log_recovery=1`时并非“崩溃安全”。 文章深入剖析了这个“地雷”的成因:在崩溃重启后,由于IO线程位置可能不准,`relay_log_recovery`会从已执行的位置重新拉取binlog并开启新的relay log。若旧的relay log被保留(`purge=0`),就可能在两个场景下出问题。一是崩溃时最后一个relay log未执行完,重启后这部分数据被重新下载,导致重复;二是如果SQL线程追赶过快,可能在IO线程尚未将relay log刷盘时就已读取执行,造成新旧文件间出现一段数据空缺。 因此,若因特殊需求必须保留relay log,在解析时务必通过binlog头信息来校验,确保数据准确无误。文章还附上了配置crash safe复制的相关参考,帮助读者从根源上稳固复制架构。